@startuml
set namespaceSeparator ::

class "vivarium_control_unit::main.dart::VivariumApp" {
  +Widget build()
  -ThemeData _theme()
}

"flutter::src::widgets::framework.dart::StatelessWidget" <|-- "vivarium_control_unit::main.dart::VivariumApp"

class "vivarium_control_unit::models::bluetoothDevice::bluetoothDevice.dart::BluetoothDevice" {
  +dynamic firebaseId
  +dynamic macAddress
  +dynamic name
  +int rssi
  +BluetoothDevice copyWith()
}

class "vivarium_control_unit::models::bluetoothDevice::bluetoothDevice.dart::BluetoothDeviceEncapsulation" {
  +List<BluetoothDevice> devices
}

class "vivarium_control_unit::models::cameraImage::cameraImage.dart::CameraImage" {
  +Uint8List data
  +DateTime updated
}

"vivarium_control_unit::models::cameraImage::cameraImage.dart::CameraImage" o-- "dart::typed_data::Uint8List"

class "vivarium_control_unit::models::device::camera::camera.dart::Camera" {
  +bool active
  +DateTime updated
  +String toString()
  +Map toJson()
}

class "vivarium_control_unit::models::device::device.dart::Device" {
  +Camera camera
  +DeviceInfo info
  +DeviceSensorData sensorData
  +DeviceSettings settings
  +DeviceState state
  +Device copyWith()
  +Map toJson()
  +dynamic toString()
}

"vivarium_control_unit::models::device::device.dart::Device" o-- "vivarium_control_unit::models::device::camera::camera.dart::Camera"
"vivarium_control_unit::models::device::device.dart::Device" o-- "vivarium_control_unit::models::device::deviceInfo.dart::DeviceInfo"
"vivarium_control_unit::models::device::device.dart::Device" o-- "vivarium_control_unit::models::device::deviceSensorData.dart::DeviceSensorData"
"vivarium_control_unit::models::device::device.dart::Device" o-- "vivarium_control_unit::models::device::deviceSettings.dart::DeviceSettings"
"vivarium_control_unit::models::device::device.dart::Device" o-- "vivarium_control_unit::models::device::deviceState.dart::DeviceState"

class "vivarium_control_unit::models::device::deviceInfo.dart::Condition" {
  +int index
  {static} +List<Condition> values
  {static} +Condition GREEN
  {static} +Condition YELLOW
  {static} +Condition RED
  {static} +Condition UNKNOWN
}

"vivarium_control_unit::models::device::deviceInfo.dart::Condition" o-- "vivarium_control_unit::models::device::deviceInfo.dart::Condition"

class "vivarium_control_unit::models::device::deviceInfo.dart::Type" {
  +int index
  {static} +List<Type> values
  {static} +Type AQUARIUM
  {static} +Type TERRARIUM
  {static} +Type UNKNOWN
}

"vivarium_control_unit::models::device::deviceInfo.dart::Type" o-- "vivarium_control_unit::models::device::deviceInfo.dart::Type"

class "vivarium_control_unit::models::device::deviceInfo.dart::DeviceInfo" {
  +bool active
  +dynamic condition
  +String id
  +List<String> locations
  +String macAddress
  +String owner
  +String name
  +String firmware
  +Map toJson()
  +String toString()
  {static} +List parseLocations()
}

class "vivarium_control_unit::models::device::deviceSensorData.dart::DeviceSensorData" {
  +SensorDataPh ph
  +SensorDataHeater heater
  +SensorDataWaterTemp waterTemp
  +SensorDataDht dht
  +SensorDataFan fan
  +SensorDataWaterLevel waterLevel
  +DeviceSensorData copyWith()
  +String toString()
}

"vivarium_control_unit::models::device::deviceSensorData.dart::DeviceSensorData" o-- "vivarium_control_unit::models::device::modules::ph::sensorData.dart::SensorDataPh"
"vivarium_control_unit::models::device::deviceSensorData.dart::DeviceSensorData" o-- "vivarium_control_unit::models::device::modules::heater::sensorData.dart::SensorDataHeater"
"vivarium_control_unit::models::device::deviceSensorData.dart::DeviceSensorData" o-- "vivarium_control_unit::models::device::modules::waterTemp::sensorData.dart::SensorDataWaterTemp"
"vivarium_control_unit::models::device::deviceSensorData.dart::DeviceSensorData" o-- "vivarium_control_unit::models::device::modules::dht::sensorData.dart::SensorDataDht"
"vivarium_control_unit::models::device::deviceSensorData.dart::DeviceSensorData" o-- "vivarium_control_unit::models::device::modules::fan::sensorData.dart::SensorDataFan"
"vivarium_control_unit::models::device::deviceSensorData.dart::DeviceSensorData" o-- "vivarium_control_unit::models::device::modules::waterLevel::sensorData.dart::SensorDataWaterLevel"

class "vivarium_control_unit::models::device::deviceSettings.dart::DeviceSettings" {
  +SettingsPh ph
  +SettingsFeeder feeder
  +SettingsFan fan
  +SettingsLed led
  +SettingsDht dht
  +SettingsHeater heater
  +SettingsHumidifier humidifier
  +SettingsWaterLevel waterLevel
  +SettingsWaterPump pump
  +SettingsWaterTemp waterTemp
  +Map toJson()
  +String toString()
}

"vivarium_control_unit::models::device::deviceSettings.dart::DeviceSettings" o-- "vivarium_control_unit::models::device::modules::ph::settings.dart::SettingsPh"
"vivarium_control_unit::models::device::deviceSettings.dart::DeviceSettings" o-- "vivarium_control_unit::models::device::modules::feeder::settings.dart::SettingsFeeder"
"vivarium_control_unit::models::device::deviceSettings.dart::DeviceSettings" o-- "vivarium_control_unit::models::device::modules::fan::settings.dart::SettingsFan"
"vivarium_control_unit::models::device::deviceSettings.dart::DeviceSettings" o-- "vivarium_control_unit::models::device::modules::led::settings.dart::SettingsLed"
"vivarium_control_unit::models::device::deviceSettings.dart::DeviceSettings" o-- "vivarium_control_unit::models::device::modules::dht::settings.dart::SettingsDht"
"vivarium_control_unit::models::device::deviceSettings.dart::DeviceSettings" o-- "vivarium_control_unit::models::device::modules::heater::settings.dart::SettingsHeater"
"vivarium_control_unit::models::device::deviceSettings.dart::DeviceSettings" o-- "vivarium_control_unit::models::device::modules::hum::settings.dart::SettingsHumidifier"
"vivarium_control_unit::models::device::deviceSettings.dart::DeviceSettings" o-- "vivarium_control_unit::models::device::modules::waterLevel::settings.dart::SettingsWaterLevel"
"vivarium_control_unit::models::device::deviceSettings.dart::DeviceSettings" o-- "vivarium_control_unit::models::device::modules::waterPump::settings.dart::SettingsWaterPump"
"vivarium_control_unit::models::device::deviceSettings.dart::DeviceSettings" o-- "vivarium_control_unit::models::device::modules::waterTemp::settings.dart::SettingsWaterTemp"

class "vivarium_control_unit::models::device::modules::dht::sensorData.dart::SensorDataDht" {
  +double humidity
  +double temperature
  +String toString()
}

class "vivarium_control_unit::models::device::modules::dht::settings.dart::SettingsDht" {
  +double maxHum
  +double minHum
  +double maxTemp
  +double minTemp
  +Map toJson()
  +String toString()
}

class "vivarium_control_unit::models::device::modules::fan::sensorData.dart::SensorDataFan" {
  +double speed
  +String toString()
}

class "vivarium_control_unit::models::device::modules::fan::settings.dart::SettingsFan" {
  +double maxAt
  +double startAt
  +Map toJson()
  +String toString()
}

class "vivarium_control_unit::models::device::modules::feeder::settings.dart::SettingsFeeder" {
  +Map<String, FeedTrigger> triggers
  +int type
  +FeedTrigger nextTrigger
  +FeedTrigger getLast
  +Map toJson()
  +String toString()
}

"vivarium_control_unit::models::device::modules::feeder::settings.dart::SettingsFeeder" o-- "vivarium_control_unit::models::device::modules::feeder::trigger.dart::FeedTrigger"

class "vivarium_control_unit::models::device::modules::feeder::trigger.dart::FeedTrigger" {
  +int time
  +Map toJson()
  +String toString()
}

class "vivarium_control_unit::models::device::modules::heater::sensorData.dart::SensorDataHeater" {
  +double power
  +double tempGoal
  +String toString()
}

class "vivarium_control_unit::models::device::modules::heater::settings.dart::SettingsHeater" {
  {static} +Map<int, String> modeValues
  +int mode
  +double tempGoal
  +Map toJson()
  +String toString()
}

class "vivarium_control_unit::models::device::modules::hum::settings.dart::SettingsHumidifier" {
  +double goalHum
  +Map toJson()
  +String toString()
}

class "vivarium_control_unit::models::device::modules::led::settings.dart::SettingsLed" {
  +Map<String, LedTrigger> triggers
  +LedTrigger nextTrigger
  +LedTrigger lastTrigger
  +Map toJson()
  +String toString()
}

"vivarium_control_unit::models::device::modules::led::settings.dart::SettingsLed" o-- "vivarium_control_unit::models::device::modules::led::trigger.dart::LedTrigger"

class "vivarium_control_unit::models::device::modules::led::trigger.dart::LedTrigger" {
  +int time
  +int color
  +Map toJson()
  +String toString()
}

class "vivarium_control_unit::models::device::modules::modules.dart::VivariumModule" {
  +int index
  {static} +List<VivariumModule> values
  {static} +VivariumModule DHT
  {static} +VivariumModule FAN
  {static} +VivariumModule FEEDER
  {static} +VivariumModule HEATER
  {static} +VivariumModule HUMIDIFIER
  {static} +VivariumModule LED
  {static} +VivariumModule PH
  {static} +VivariumModule WL
  {static} +VivariumModule PUMP
  {static} +VivariumModule WT
}

"vivarium_control_unit::models::device::modules::modules.dart::VivariumModule" o-- "vivarium_control_unit::models::device::modules::modules.dart::VivariumModule"

class "vivarium_control_unit::models::device::modules::ph::sensorData.dart::SensorDataPh" {
  +double currentPh
  +String toString()
}

class "vivarium_control_unit::models::device::modules::ph::settings.dart::SettingsPh" {
  +double maxPh
  +double minPh
  +bool continuous
  +int continuousDelay
  +Map toJson()
  +String toString()
}

class "vivarium_control_unit::models::device::modules::ph::state.dart::PhMode" {
  +int index
  {static} +List<PhMode> values
  {static} +PhMode ONCE
  {static} +PhMode CONTINUOUS
}

"vivarium_control_unit::models::device::modules::ph::state.dart::PhMode" o-- "vivarium_control_unit::models::device::modules::ph::state.dart::PhMode"

class "vivarium_control_unit::models::device::modules::waterLevel::sensorData.dart::SensorDataWaterLevel" {
  +double level
  +String toString()
}

class "vivarium_control_unit::models::device::modules::waterLevel::settings.dart::SettingsWaterLevel" {
  +double maxLevel
  +double minLevel
  +double sensorHeight
  +Map toJson()
  +String toString()
}

class "vivarium_control_unit::models::device::modules::waterPump::settings.dart::SettingsWaterPump" {
  +double goalLevel
  +Map toJson()
  +String toString()
}

class "vivarium_control_unit::models::device::modules::waterTemp::sensorData.dart::SensorDataWaterTemp" {
  +double currentTemp
  +String toString()
}

class "vivarium_control_unit::models::device::modules::waterTemp::settings.dart::SettingsWaterTemp" {
  +double maxTemp
  +double minTemp
  +Map toJson()
  +String toString()
}

class "vivarium_control_unit::models::drawer::navigationModel.dart::NavigationModel" {
  +dynamic title
  +IconData icon
  +NavigationPage page
  +dynamic route
  +bool anonymousAccess
}

"vivarium_control_unit::models::drawer::navigationModel.dart::NavigationModel" o-- "flutter::src::widgets::icon_data.dart::IconData"
"vivarium_control_unit::models::drawer::navigationModel.dart::NavigationModel" o-- "vivarium_control_unit::models::drawer::navigationModel.dart::NavigationPage"

class "vivarium_control_unit::models::sensorDataHistory::sensorDataHistory.dart::SensorDataHistory" {
  +SplayTreeMap<DateTime, SensorDataPh> phMap
  +SplayTreeMap<DateTime, SensorDataWaterTemp> waterTempMap
  +SplayTreeMap<DateTime, SensorDataHeater> heaterMap
  +SplayTreeMap<DateTime, SensorDataDht> dhtMap
  +SplayTreeMap<DateTime, SensorDataWaterLevel> waterLevelMap
  +Map<DateTime, double> heaterGoalHistory
  +Map<DateTime, double> heaterPowerHistory
  +Map<DateTime, double> waterTempHistory
  +Map<DateTime, double> dhtTempHistory
  +Map<DateTime, double> dhtHumHistory
  +Map<DateTime, double> waterLevelHistory
  +Map<DateTime, double> phHistory
}

"vivarium_control_unit::models::sensorDataHistory::sensorDataHistory.dart::SensorDataHistory" o-- "dart::collection::SplayTreeMap<DateTime, SensorDataPh>"
"vivarium_control_unit::models::sensorDataHistory::sensorDataHistory.dart::SensorDataHistory" o-- "dart::collection::SplayTreeMap<DateTime, SensorDataWaterTemp>"
"vivarium_control_unit::models::sensorDataHistory::sensorDataHistory.dart::SensorDataHistory" o-- "dart::collection::SplayTreeMap<DateTime, SensorDataHeater>"
"vivarium_control_unit::models::sensorDataHistory::sensorDataHistory.dart::SensorDataHistory" o-- "dart::collection::SplayTreeMap<DateTime, SensorDataDht>"
"vivarium_control_unit::models::sensorDataHistory::sensorDataHistory.dart::SensorDataHistory" o-- "dart::collection::SplayTreeMap<DateTime, SensorDataWaterLevel>"

class "vivarium_control_unit::models::user::user.dart::VivariumUser" {
  +String userName
  +String userEmail
  +String userId
  +String imageUrl
  +String toString()
}

class "vivarium_control_unit::ui::addDevice::bluetoothDeviceTile.dart::BluetoothDeviceTile" {
  +BluetoothDevice device
  +void Function() onTap
  +Widget build()
  -Color _calculateColor()
}

"vivarium_control_unit::ui::addDevice::bluetoothDeviceTile.dart::BluetoothDeviceTile" o-- "vivarium_control_unit::models::bluetoothDevice::bluetoothDevice.dart::BluetoothDevice"
"vivarium_control_unit::ui::addDevice::bluetoothDeviceTile.dart::BluetoothDeviceTile" o-- "flutter::src::gestures::tap.dart::void Function()"
"flutter::src::widgets::framework.dart::StatelessWidget" <|-- "vivarium_control_unit::ui::addDevice::bluetoothDeviceTile.dart::BluetoothDeviceTile"

class "vivarium_control_unit::ui::addDevice::resultList.dart::ResultList" {
  +dynamic deviceId
  +Widget build()
}

"flutter::src::widgets::framework.dart::StatelessWidget" <|-- "vivarium_control_unit::ui::addDevice::resultList.dart::ResultList"

class "vivarium_control_unit::ui::addDeviceDialog::addDeviceDialog.dart::AddDeviceDialog" {
  +BluetoothDevice device
  +Widget build()
}

"vivarium_control_unit::ui::addDeviceDialog::addDeviceDialog.dart::AddDeviceDialog" o-- "vivarium_control_unit::models::bluetoothDevice::bluetoothDevice.dart::BluetoothDevice"
"flutter::src::widgets::framework.dart::StatelessWidget" <|-- "vivarium_control_unit::ui::addDeviceDialog::addDeviceDialog.dart::AddDeviceDialog"

class "vivarium_control_unit::ui::addDeviceDialog::addDeviceForm.dart::AddDeviceForm" {
  +BluetoothDevice device
  +TextStyle headlineStyle
}

"vivarium_control_unit::ui::addDeviceDialog::addDeviceForm.dart::AddDeviceForm" o-- "vivarium_control_unit::models::bluetoothDevice::bluetoothDevice.dart::BluetoothDevice"
"vivarium_control_unit::ui::addDeviceDialog::addDeviceForm.dart::AddDeviceForm" o-- "flutter::src::painting::text_style.dart::TextStyle"
"flutter::src::widgets::framework.dart::StatefulWidget" <|-- "vivarium_control_unit::ui::addDeviceDialog::addDeviceForm.dart::AddDeviceForm"

class "vivarium_control_unit::ui::common::styles.dart::DeviceSize" {
  +int index
  {static} +List<DeviceSize> values
  {static} +DeviceSize big
  {static} +DeviceSize small
  {static} +DeviceSize smallest
}

"vivarium_control_unit::ui::common::styles.dart::DeviceSize" o-- "vivarium_control_unit::ui::common::styles.dart::DeviceSize"

class "vivarium_control_unit::ui::common::styles.dart::ButtonHeight" {
  {static} +double big
  {static} +double small
}

class "vivarium_control_unit::ui::common::styles.dart::TextFieldHeight" {
  {static} +double big
  {static} +double small
  {static} +double smallest
}

class "vivarium_control_unit::ui::common::styles.dart::DeviceWidth" {
  {static} +double big
  {static} +double small
}

class "vivarium_control_unit::ui::common::styles.dart::HeaderStyle" {
  {static} +TextStyle big
  {static} +TextStyle small
  {static} +TextStyle smallest
}

"vivarium_control_unit::ui::common::styles.dart::HeaderStyle" o-- "flutter::src::painting::text_style.dart::TextStyle"

class "vivarium_control_unit::ui::common::styles.dart::ErrorStyle" {
  {static} +TextStyle big
  {static} +TextStyle small
  {static} +TextStyle smallest
}

"vivarium_control_unit::ui::common::styles.dart::ErrorStyle" o-- "flutter::src::painting::text_style.dart::TextStyle"

class "vivarium_control_unit::ui::device::camera::addCamera::addCameraDialog.dart::AddCameraDialog" {
  +BluetoothDevice device
  +Widget build()
}

"vivarium_control_unit::ui::device::camera::addCamera::addCameraDialog.dart::AddCameraDialog" o-- "vivarium_control_unit::models::bluetoothDevice::bluetoothDevice.dart::BluetoothDevice"
"flutter::src::widgets::framework.dart::StatelessWidget" <|-- "vivarium_control_unit::ui::device::camera::addCamera::addCameraDialog.dart::AddCameraDialog"

class "vivarium_control_unit::ui::device::camera::addCamera::AddCameraForm.dart::AddCameraForm" {
  +BluetoothDevice device
  +TextStyle headlineStyle
}

"vivarium_control_unit::ui::device::camera::addCamera::AddCameraForm.dart::AddCameraForm" o-- "vivarium_control_unit::models::bluetoothDevice::bluetoothDevice.dart::BluetoothDevice"
"vivarium_control_unit::ui::device::camera::addCamera::AddCameraForm.dart::AddCameraForm" o-- "flutter::src::painting::text_style.dart::TextStyle"
"flutter::src::widgets::framework.dart::StatefulWidget" <|-- "vivarium_control_unit::ui::device::camera::addCamera::AddCameraForm.dart::AddCameraForm"

class "vivarium_control_unit::ui::device::camera::addCamera::camerasList::resultList.dart::ResultList" {
  +dynamic firebaseId
  +Widget build()
}

"flutter::src::widgets::framework.dart::StatelessWidget" <|-- "vivarium_control_unit::ui::device::camera::addCamera::camerasList::resultList.dart::ResultList"

class "vivarium_control_unit::ui::device::camera::cameraSubpage.dart::CameraSubpage" {
  +Widget build()
}

"flutter::src::widgets::framework.dart::StatelessWidget" <|-- "vivarium_control_unit::ui::device::camera::cameraSubpage.dart::CameraSubpage"

class "vivarium_control_unit::ui::device::connectionButton.dart::BluetoothConnectionButton" {
  +Widget build()
}

"flutter::src::widgets::framework.dart::StatelessWidget" <|-- "vivarium_control_unit::ui::device::connectionButton.dart::BluetoothConnectionButton"

class "vivarium_control_unit::ui::device::overview::animatedChart.dart::AnimatedChart" {
  +List<Map<DateTime, double>> lines
  +List<Color> colors
  +List units
  +double height
  +double width
  +Color backgroundColor
}

"vivarium_control_unit::ui::device::overview::animatedChart.dart::AnimatedChart" o-- "dart::ui::Color"
"flutter::src::widgets::framework.dart::StatefulWidget" <|-- "vivarium_control_unit::ui::device::overview::animatedChart.dart::AnimatedChart"

class "vivarium_control_unit::ui::device::overview::iconRotation.dart::IconRotation" {
  +double speed
  +Widget icon
}

"vivarium_control_unit::ui::device::overview::iconRotation.dart::IconRotation" o-- "flutter::src::widgets::framework.dart::Widget"
"flutter::src::widgets::framework.dart::StatefulWidget" <|-- "vivarium_control_unit::ui::device::overview::iconRotation.dart::IconRotation"

class "vivarium_control_unit::ui::device::settings::cameraPanel.dart::CameraPanel" {
  +TextEditingController ssidController
  +TextEditingController passController
  +Widget build()
}

"vivarium_control_unit::ui::device::settings::cameraPanel.dart::CameraPanel" o-- "flutter::src::widgets::editable_text.dart::TextEditingController"
"flutter::src::widgets::framework.dart::StatelessWidget" <|-- "vivarium_control_unit::ui::device::settings::cameraPanel.dart::CameraPanel"

class "vivarium_control_unit::ui::device::settings::devicePanel.dart::DevicePanel" {
  +TextEditingController ssidController
  +TextEditingController passController
  +Widget build()
}

"vivarium_control_unit::ui::device::settings::devicePanel.dart::DevicePanel" o-- "flutter::src::widgets::editable_text.dart::TextEditingController"
"flutter::src::widgets::framework.dart::StatelessWidget" <|-- "vivarium_control_unit::ui::device::settings::devicePanel.dart::DevicePanel"

class "vivarium_control_unit::ui::device::settings::modulePanel.dart::ModulePanel" {
  +Widget build()
}

"flutter::src::widgets::framework.dart::StatelessWidget" <|-- "vivarium_control_unit::ui::device::settings::modulePanel.dart::ModulePanel"

class "vivarium_control_unit::ui::device::settings::modules::dht.dart::DhtModuleSettings" {
}

"flutter::src::widgets::framework.dart::StatefulWidget" <|-- "vivarium_control_unit::ui::device::settings::modules::dht.dart::DhtModuleSettings"

class "vivarium_control_unit::ui::device::settings::modules::fan.dart::FanModuleSettings" {
}

"flutter::src::widgets::framework.dart::StatefulWidget" <|-- "vivarium_control_unit::ui::device::settings::modules::fan.dart::FanModuleSettings"

class "vivarium_control_unit::ui::device::settings::modules::feeder.dart::FeederModuleSettings" {
}

"flutter::src::widgets::framework.dart::StatefulWidget" <|-- "vivarium_control_unit::ui::device::settings::modules::feeder.dart::FeederModuleSettings"

class "vivarium_control_unit::ui::device::settings::modules::feederTriggerTile.dart::FeederTriggerTile" {
  +dynamic feederKey
  +FeedTrigger trigger
  +void Function() onDelete
  +void Function(int) onChanged
  +Widget build()
}

"vivarium_control_unit::ui::device::settings::modules::feederTriggerTile.dart::FeederTriggerTile" o-- "vivarium_control_unit::models::device::modules::feeder::trigger.dart::FeedTrigger"
"vivarium_control_unit::ui::device::settings::modules::feederTriggerTile.dart::FeederTriggerTile" o-- "dart::ui::void Function()"
"vivarium_control_unit::ui::device::settings::modules::feederTriggerTile.dart::FeederTriggerTile" o-- "flutter::src::foundation::basic_types.dart::void Function(int)"
"flutter::src::widgets::framework.dart::StatelessWidget" <|-- "vivarium_control_unit::ui::device::settings::modules::feederTriggerTile.dart::FeederTriggerTile"

class "vivarium_control_unit::ui::device::settings::modules::heater.dart::HeaterModuleSettings" {
}

"flutter::src::widgets::framework.dart::StatefulWidget" <|-- "vivarium_control_unit::ui::device::settings::modules::heater.dart::HeaterModuleSettings"

class "vivarium_control_unit::ui::device::settings::modules::humidifier.dart::HumidifierModuleSettings" {
}

"flutter::src::widgets::framework.dart::StatefulWidget" <|-- "vivarium_control_unit::ui::device::settings::modules::humidifier.dart::HumidifierModuleSettings"

class "vivarium_control_unit::ui::device::settings::modules::led.dart::LedModuleSettings" {
}

"flutter::src::widgets::framework.dart::StatefulWidget" <|-- "vivarium_control_unit::ui::device::settings::modules::led.dart::LedModuleSettings"

class "vivarium_control_unit::ui::device::settings::modules::ledTriggerTile.dart::LedTriggerTile" {
  +dynamic ledKey
  +LedTrigger trigger
  +void Function() onDelete
  +void Function(int) onTimeChanged
  +void Function(int) onColorChanged
}

"vivarium_control_unit::ui::device::settings::modules::ledTriggerTile.dart::LedTriggerTile" o-- "vivarium_control_unit::models::device::modules::led::trigger.dart::LedTrigger"
"vivarium_control_unit::ui::device::settings::modules::ledTriggerTile.dart::LedTriggerTile" o-- "dart::ui::void Function()"
"vivarium_control_unit::ui::device::settings::modules::ledTriggerTile.dart::LedTriggerTile" o-- "flutter::src::foundation::basic_types.dart::void Function(int)"
"flutter::src::widgets::framework.dart::StatefulWidget" <|-- "vivarium_control_unit::ui::device::settings::modules::ledTriggerTile.dart::LedTriggerTile"

class "vivarium_control_unit::ui::device::settings::modules::ph.dart::PhModuleSettings" {
}

"flutter::src::widgets::framework.dart::StatefulWidget" <|-- "vivarium_control_unit::ui::device::settings::modules::ph.dart::PhModuleSettings"

class "vivarium_control_unit::ui::device::settings::modules::waterLevel.dart::WaterLevelModuleSettings" {
}

"flutter::src::widgets::framework.dart::StatefulWidget" <|-- "vivarium_control_unit::ui::device::settings::modules::waterLevel.dart::WaterLevelModuleSettings"

class "vivarium_control_unit::ui::device::settings::modules::waterPump.dart::WaterPumpModuleSettings" {
}

"flutter::src::widgets::framework.dart::StatefulWidget" <|-- "vivarium_control_unit::ui::device::settings::modules::waterPump.dart::WaterPumpModuleSettings"

class "vivarium_control_unit::ui::device::settings::modules::waterTemp.dart::WaterTempModuleSettings" {
}

"flutter::src::widgets::framework.dart::StatefulWidget" <|-- "vivarium_control_unit::ui::device::settings::modules::waterTemp.dart::WaterTempModuleSettings"

class "vivarium_control_unit::ui::device::settings::settingsSubpage.dart::SettingsSubpage" {
  +Widget build()
}

"flutter::src::widgets::framework.dart::StatelessWidget" <|-- "vivarium_control_unit::ui::device::settings::settingsSubpage.dart::SettingsSubpage"

class "vivarium_control_unit::ui::devices::deviceList.dart::DeviceList" {
  +Widget build()
}

"flutter::src::widgets::framework.dart::StatelessWidget" <|-- "vivarium_control_unit::ui::devices::deviceList.dart::DeviceList"

class "vivarium_control_unit::ui::homepage::anonymousBig.dart::AnonymousBig" {
  +Widget build()
}

"flutter::src::widgets::framework.dart::StatelessWidget" <|-- "vivarium_control_unit::ui::homepage::anonymousBig.dart::AnonymousBig"

class "vivarium_control_unit::ui::homepage::anonymousSmall.dart::AnonymousSmall" {
  +Widget build()
}

"flutter::src::widgets::framework.dart::StatelessWidget" <|-- "vivarium_control_unit::ui::homepage::anonymousSmall.dart::AnonymousSmall"

class "vivarium_control_unit::ui::homepage::userOverview::overview.dart::UserSmall" {
  +Widget build()
}

"flutter::src::widgets::framework.dart::StatelessWidget" <|-- "vivarium_control_unit::ui::homepage::userOverview::overview.dart::UserSmall"

class "vivarium_control_unit::ui::login::loginForm.dart::LoginForm" {
  +TextStyle headerStyle
  +double textFieldHeight
}

"vivarium_control_unit::ui::login::loginForm.dart::LoginForm" o-- "flutter::src::painting::text_style.dart::TextStyle"
"flutter::src::widgets::framework.dart::StatefulWidget" <|-- "vivarium_control_unit::ui::login::loginForm.dart::LoginForm"

class "vivarium_control_unit::ui::login::loginInfo.dart::LoginInfo" {
  +bool showImage
  +bool textToRow
  +Widget build()
}

"flutter::src::widgets::framework.dart::StatelessWidget" <|-- "vivarium_control_unit::ui::login::loginInfo.dart::LoginInfo"

class "vivarium_control_unit::ui::register::registerForm.dart::RegisterForm" {
  +TextStyle headerStyle
  +TextStyle errorStyle
  +double textFieldHeight
}

"vivarium_control_unit::ui::register::registerForm.dart::RegisterForm" o-- "flutter::src::painting::text_style.dart::TextStyle"
"flutter::src::widgets::framework.dart::StatefulWidget" <|-- "vivarium_control_unit::ui::register::registerForm.dart::RegisterForm"

class "vivarium_control_unit::ui::register::registerInfo.dart::RegisterInfo" {
  +Widget build()
}

"flutter::src::widgets::framework.dart::StatelessWidget" <|-- "vivarium_control_unit::ui::register::registerInfo.dart::RegisterInfo"

class "vivarium_control_unit::ui::widgets::settings::divider.dart::SettingsDivider" {
  +Color color
  +double thickness
  +double height
  +double indent
  +double endIndent
  +Widget build()
}

"vivarium_control_unit::ui::widgets::settings::divider.dart::SettingsDivider" o-- "dart::ui::Color"
"flutter::src::widgets::framework.dart::StatelessWidget" <|-- "vivarium_control_unit::ui::widgets::settings::divider.dart::SettingsDivider"

class "vivarium_control_unit::ui::widgets::settings::SettingsDropdown.dart::SettingsDropdown" {
  +dynamic title
  +Map<int, dynamic> items
  +int value
  +dynamic providerKey
  +void Function(int) onChanged
}

"vivarium_control_unit::ui::widgets::settings::SettingsDropdown.dart::SettingsDropdown" o-- "flutter::src::foundation::basic_types.dart::void Function(int)"
"flutter::src::widgets::framework.dart::StatefulWidget" <|-- "vivarium_control_unit::ui::widgets::settings::SettingsDropdown.dart::SettingsDropdown"

class "vivarium_control_unit::ui::widgets::settings::SettingsExpansionTile.dart::SettingsExpansionTile" {
  +Color iconColor
  +Widget leading
  +Widget title
  +Widget subtitle
  +void Function(bool) onExpansionChanged
  +List<Widget> children
  +Color backgroundColor
  +Widget trailing
  +bool initiallyExpanded
  +EdgeInsetsGeometry tilePadding
  +Alignment expandedAlignment
  +CrossAxisAlignment expandedCrossAxisAlignment
  +EdgeInsetsGeometry childrenPadding
}

"vivarium_control_unit::ui::widgets::settings::SettingsExpansionTile.dart::SettingsExpansionTile" o-- "dart::ui::Color"
"vivarium_control_unit::ui::widgets::settings::SettingsExpansionTile.dart::SettingsExpansionTile" o-- "flutter::src::widgets::framework.dart::Widget"
"vivarium_control_unit::ui::widgets::settings::SettingsExpansionTile.dart::SettingsExpansionTile" o-- "flutter::src::foundation::basic_types.dart::void Function(bool)"
"vivarium_control_unit::ui::widgets::settings::SettingsExpansionTile.dart::SettingsExpansionTile" o-- "flutter::src::painting::edge_insets.dart::EdgeInsetsGeometry"
"vivarium_control_unit::ui::widgets::settings::SettingsExpansionTile.dart::SettingsExpansionTile" o-- "flutter::src::painting::alignment.dart::Alignment"
"vivarium_control_unit::ui::widgets::settings::SettingsExpansionTile.dart::SettingsExpansionTile" o-- "flutter::src::rendering::flex.dart::CrossAxisAlignment"
"flutter::src::widgets::framework.dart::StatefulWidget" <|-- "vivarium_control_unit::ui::widgets::settings::SettingsExpansionTile.dart::SettingsExpansionTile"

class "vivarium_control_unit::ui::widgets::settings::SettingsSlider.dart::SettingsSlider" {
  +dynamic providerKey
  +dynamic title
  +double value
  +void Function(double) onChanged
  +void Function(double) onChangeEnd
  +double upLimit
  +double lowLimit
  +double max
  +double min
  +int division
}

"vivarium_control_unit::ui::widgets::settings::SettingsSlider.dart::SettingsSlider" o-- "flutter::src::foundation::basic_types.dart::void Function(double)"
"flutter::src::widgets::framework.dart::StatefulWidget" <|-- "vivarium_control_unit::ui::widgets::settings::SettingsSlider.dart::SettingsSlider"

class "vivarium_control_unit::utils::bluetooth::bluetoothConnector.dart::BluetoothConnector" {
  -bool _connecting
  +dynamic deviceId
  +List<VivariumModule> modules
  -FlutterReactiveBle _flutterReactiveBle
  -StreamSubscription<ConnectionStateUpdate> _connectionSubscription
  -StreamController<DeviceState> _stateStreamController
  -DeviceState _state
  -StreamSubscription _phConnectedSubscription
  -StreamSubscription _humConnectedSubscription
  -StreamSubscription _humRunningSubscription
  -StreamSubscription _dhtConnectedSubscription
  -StreamSubscription _waterTempConnectedSubscription
  -StreamSubscription _waterLevelConnectedSubscription
  -StreamSubscription _heaterConnectedSubscription
  -StreamSubscription _fanConnectedSubscription
  -StreamSubscription _feederConnectedSubscription
  -StreamSubscription _ledConnectedSubscription
  -StreamSubscription _waterPumpConnectedSubscription
  -StreamSubscription _waterPumpRunningSubscription
  -StreamController<DeviceSensorData> _sensorDataStreamController
  -StreamSubscription _heaterGoalSubscription
  -StreamSubscription _heaterPowerSubscription
  -StreamSubscription _waterLevelSubscription
  -StreamSubscription _waterTempSubscription
  -StreamSubscription _dhtHumSubscription
  -StreamSubscription _dhtTempSubscription
  -StreamSubscription _fanSpeedSubscription
  -StreamSubscription _phSubscription
  -DeviceSensorData _data
  +bool isConnected
  +BleStatus bluetoothStatus
  +Stream<BleStatus> bluetoothStatusStream
  +Stream<DeviceState> stateStream
  +DeviceState state
  +Stream<DeviceSensorData> sensorDataStream
  +DeviceSensorData data
  +Stream isDeviceClaimedStream()
  +Future connect()
  +Future isClaimed()
  +Future disconnect()
  +Future cancelCharacteristicSubscriptions()
  +Future dispose()
  +Future claimDevice()
  +Future claimCamera()
  +Future unclaimCamera()
  +dynamic trimStringFromCharacteristic()
  +Future unclaimDevice()
  +Future setCredentials()
  +Future clearCredentials()
  +Future writeCharacteristic()
  +Future getModules()
  +Future printCharacteristics()
  +Stream doubleStream()
  +Future saveValue()
  +Future initSensorStreamData()
  +Future startSensorDataStream()
  +double doubleFromResponse()
  +bool boolFromResponse()
}

"vivarium_control_unit::utils::bluetooth::bluetoothConnector.dart::BluetoothConnector" o-- "flutter_reactive_ble::src::reactive_ble.dart::FlutterReactiveBle"
"vivarium_control_unit::utils::bluetooth::bluetoothConnector.dart::BluetoothConnector" o-- "dart::async::StreamSubscription<ConnectionStateUpdate>"
"vivarium_control_unit::utils::bluetooth::bluetoothConnector.dart::BluetoothConnector" o-- "dart::async::StreamController<DeviceState>"
"vivarium_control_unit::utils::bluetooth::bluetoothConnector.dart::BluetoothConnector" o-- "vivarium_control_unit::models::device::deviceState.dart::DeviceState"
"vivarium_control_unit::utils::bluetooth::bluetoothConnector.dart::BluetoothConnector" o-- "dart::async::StreamSubscription"
"vivarium_control_unit::utils::bluetooth::bluetoothConnector.dart::BluetoothConnector" o-- "dart::async::StreamController<DeviceSensorData>"
"vivarium_control_unit::utils::bluetooth::bluetoothConnector.dart::BluetoothConnector" o-- "vivarium_control_unit::models::device::deviceSensorData.dart::DeviceSensorData"
"vivarium_control_unit::utils::bluetooth::bluetoothConnector.dart::BluetoothConnector" o-- "flutter_reactive_ble::src::model::ble_status.dart::BleStatus"
"vivarium_control_unit::utils::bluetooth::bluetoothConnector.dart::BluetoothConnector" o-- "dart::async::Stream<BleStatus>"
"vivarium_control_unit::utils::bluetooth::bluetoothConnector.dart::BluetoothConnector" o-- "dart::async::Stream<DeviceState>"
"vivarium_control_unit::utils::bluetooth::bluetoothConnector.dart::BluetoothConnector" o-- "dart::async::Stream<DeviceSensorData>"

class "vivarium_control_unit::utils::bluetooth::bluetoothScanner.dart::BluetoothScanner" {
  -FlutterReactiveBle _flutterReactiveBle
  -List<BluetoothDevice> _devices
  -StreamController<BluetoothDeviceEncapsulation> _devicesController
  -StreamSubscription<DiscoveredDevice> _scanSubscription
  -StreamController<bool> _isScanningController
  +Stream<BluetoothDeviceEncapsulation> devices
  +Stream<bool> isScanning
  +Future restartDeviceScan()
  +Future startDeviceScan()
  +void stopDeviceScan()
  +void dispose()
}

"vivarium_control_unit::utils::bluetooth::bluetoothScanner.dart::BluetoothScanner" o-- "flutter_reactive_ble::src::reactive_ble.dart::FlutterReactiveBle"
"vivarium_control_unit::utils::bluetooth::bluetoothScanner.dart::BluetoothScanner" o-- "dart::async::StreamController<BluetoothDeviceEncapsulation>"
"vivarium_control_unit::utils::bluetooth::bluetoothScanner.dart::BluetoothScanner" o-- "dart::async::StreamSubscription<DiscoveredDevice>"
"vivarium_control_unit::utils::bluetooth::bluetoothScanner.dart::BluetoothScanner" o-- "dart::async::StreamController<bool>"
"vivarium_control_unit::utils::bluetooth::bluetoothScanner.dart::BluetoothScanner" o-- "dart::async::Stream<BluetoothDeviceEncapsulation>"
"vivarium_control_unit::utils::bluetooth::bluetoothScanner.dart::BluetoothScanner" o-- "dart::async::Stream<bool>"

class "vivarium_control_unit::utils::firebase::auth.dart::Auth" {
  {static} +Stream<VivariumUser> userStream
  {static} +VivariumUser user
  {static} -VivariumUser _parseFromFirebaseUser()
  +VivariumUser processCredential()
  +Future signInWithCredentialObj()
  +Future registerWithEmailPassword()
  +Future signInWithEmailAndPassword()
  +Future signOut()
  +Future onUserLoggedIn()
  +String generateToken()
}

"vivarium_control_unit::utils::firebase::auth.dart::Auth" o-- "dart::async::Stream<VivariumUser>"
"vivarium_control_unit::utils::firebase::auth.dart::Auth" o-- "vivarium_control_unit::models::user::user.dart::VivariumUser"

class "vivarium_control_unit::utils::firebase::googleAuth::googleAuth.dart::Credentials" {
  +String accessToken
  +String idToken
}

abstract class "vivarium_control_unit::utils::firebase::googleAuth::googleAuth.dart::GoogleAuth" {
  +Future signOut()
  +Future signIn()
}

class "vivarium_control_unit::utils::firebase::googleAuth::googleAuthDisabled.dart::GoogleAuthDisabled" {
  +Future signIn()
  +Future signOut()
}

"vivarium_control_unit::utils::firebase::googleAuth::googleAuth.dart::GoogleAuth" <|-- "vivarium_control_unit::utils::firebase::googleAuth::googleAuthDisabled.dart::GoogleAuthDisabled"

class "vivarium_control_unit::utils::firebase::googleAuth::googleAuthImp.dart::GoogleAuthImp" {
  -GoogleSignIn _googleSignIn
  +Future signIn()
  +Future signOut()
}

"vivarium_control_unit::utils::firebase::googleAuth::googleAuthImp.dart::GoogleAuthImp" o-- "google_sign_in::google_sign_in.dart::GoogleSignIn"
"vivarium_control_unit::utils::firebase::googleAuth::googleAuth.dart::GoogleAuth" <|-- "vivarium_control_unit::utils::firebase::googleAuth::googleAuthImp.dart::GoogleAuthImp"

class "vivarium_control_unit::utils::platform::platform.dart::PlatformType" {
  +int index
  {static} +List<PlatformType> values
  {static} +PlatformType Web
  {static} +PlatformType iOS
  {static} +PlatformType Android
  {static} +PlatformType MacOS
  {static} +PlatformType Fuchsia
  {static} +PlatformType Linux
  {static} +PlatformType Windows
  {static} +PlatformType Unknown
}

"vivarium_control_unit::utils::platform::platform.dart::PlatformType" o-- "vivarium_control_unit::utils::platform::platform.dart::PlatformType"

class "vivarium_control_unit::utils::platform::platform.dart::PlatformInfo" {
  {static} +bool isDesktopOS()
  {static} +bool isAppOS()
  {static} +bool isIOS()
  {static} +bool isWeb()
  {static} +PlatformType getCurrentPlatformType()
}


@enduml